import java.util.Arrays;
public class CircularQueue {
    //循环队列的底层是数组
    int [] elem;
    int front=0;//队头
    int rear=0;//队尾
    //开辟k个空间
    public  void creatQueue(int k){
        this.elem=new int[k];
    }
    //入队列
    public boolean enQueue(int value) {
        //判断循环队列是否满了
        if(isFull()){//满了就扩容
            this.elem= Arrays.copyOf(this.elem,
                    2*this.elem.length);
        }//没满，就入队
        this.elem[rear]=value;
        rear=(rear+1)%elem.length;//这样保证，rear的取值都在
         return true;                         // 0-elem.length-1
    }
    protected boolean isFull(){
        return (rear+1)%elem.length==front;
    }
    //出队列
    public boolean deQueue() {
        //先判断循环队列是否为空
        if(isEmpty()){//空的
            System.out.println("循环队列为空");
            return false;
        }//不为空，出队列
        front=(front+1)%elem.length;//就是front往前走一步
        return true;
    }
   protected boolean isEmpty(){
        return rear==front;//因为初始都是0
   }
   //获取队头元素
    public int getFront(){
        //判断循环队列是否为空
        if (isEmpty()){
            throw new QueueEmptyExption("此循环队列为空,无法偷看");
        }//不为空，查看
        return this.elem[front];
    }
    //获取有效元素个数
    public int size(){
       if(rear-front>0){
           return rear-front;
       }//如果队尾的值小于队头
       return rear-front+elem.length;
    }
    //查看队尾元素
    public  int getRear(){
        if (isEmpty()){
            throw new QueueEmptyExption("此循环队列为空，无法查看");
        }
        int index=rear==0?elem.length-1:rear-1;
        //这是害怕rear到了初始位置0，0-1=-1；就会数组越界。
        return elem[index];
    }
}
